트러블슈팅 기법
쿠버네티스 환경에서 문제가 발생했을 때 체계적으로 진단하고 해결하는 방법입니다.
주요 트러블슈팅 영역
- 파드 장애: 파드가 시작되지 않거나 크래시되는 문제
- 네트워크 문제: 서비스 연결, 인그레스, DNS 관련 이슈
- 스케줄링 문제: 파드가 노드에 할당되지 않는 문제
- 리소스 부족: CPU, 메모리, 디스크 공간 등의 부족
- 인증/인가 문제: RBAC 구성 오류, 인증서 문제
클라우드 네트워크 개념과 비교
- 통합 로깅 및 모니터링: 클라우드 환경의 중앙 집중식 로깅 및 모니터링과 유사
- 리소스 상태 확인: 클라우드 리소스 상태 점검 도구와 개념적으로 유사
실습 예시
파드 트러블슈팅
# 파드 상태 확인
kubectl get pods
# 파드 상세 정보 확인
kubectl describe pod <pod-name>
# 파드 로그 확인
kubectl logs <pod-name>
kubectl logs <pod-name> -c <container-name> # 다중 컨테이너 파드의 경우
# 이전 인스턴스 로그 확인
kubectl logs <pod-name> --previous
# 파드 내부 디버깅을 위한 임시 컨테이너 실행
kubectl debug <pod-name> -it --image=busybox --target=<container-name>
네트워크 트러블슈팅
# 서비스 엔드포인트 확인
kubectl get endpoints <service-name>
# DNS 확인
kubectl run curl --image=curlimages/curl -i --tty -- sh
# 컨테이너 내부에서:
nslookup kubernetes.default.svc.cluster.local
# 서비스 연결 테스트
kubectl run test --image=busybox -i --tty --rm -- wget -qO- <service-name>.<namespace>.svc.cluster.local
노드 트러블슈팅
# 노드 상태 확인
kubectl get nodes
kubectl describe node <node-name>
# 노드 리소스 사용량 확인
kubectl top node
# kubelet 로그 확인 (노드에서 직접)
journalctl -u kubelet
# 노드 컴포넌트 상태 확인
kubectl get componentstatuses
일반적인 문제 및 해결 방법
파드가 'Pending' 상태에 머무르는 경우
- 리소스 부족: CPU나 메모리 요청을 줄이거나 노드 확장
- Taint/Toleration: 노드 테인트와 파드 톨러레이션 확인
- 볼륨 문제: PV/PVC 상태 및 가용성 확인
파드가 'CrashLoopBackOff' 상태인 경우
- 애플리케이션 오류: 로그를 확인하여 애플리케이션 내부 오류 진단
- 리소스 설정 오류: 메모리 제한 확인
- 구성 오류: ConfigMap이나 Secret이 올바르게 마운트되었는지 확인
서비스 연결 문제
- 셀렉터 확인: 서비스와 파드의 라벨 셀렉터 일치 여부 확인
- 엔드포인트 확인: 서비스 엔드포인트에 파드가 등록되었는지 확인
- 네트워크 정책: NetworkPolicy가 트래픽을 차단하는지 확인
인증/인가 문제
- RBAC 구성: Role과 RoleBinding 확인
- ServiceAccount: 올바른 ServiceAccount 사용 확인
- 인증서: 클라이언트 및 서버 인증서 유효성 확인